なりすましを防止して、楕円曲線ディフィー・ヘルマン鍵共有でForward secrecyなエンドーツーエンド暗号化する方法を考える
やりたいこと
通信相手が本当に思っている人かどうかを確認したい
使う暗号技術
通信相手の公開鍵
なりすまされないようにするために使う
メッセージの暗号化目的ではない
通信相手を確かめるために使う
予め信頼できるソースから通信相手の公開鍵を入手しておいて、通信相手がそれの秘密鍵をちゃんと持っているかで相手を確かめるつもり
これで共通鍵を安全でなくて良い通信路で共有する
なりすましを防止する方法を考える
今の案は、
前提:
AさんとBさんがいる。
Aさんが、通信相手Bさんが本物かどうか確認したい。
Aさんは、Bさんの公開鍵を信頼できるソースから取得済み。
Aさんが、Bさんが本物か確かめる手順:
1. AさんBさん間で、先に楕円曲線ディフィー・ヘルマン鍵共有で共有鍵を生成
2. Bさんが、その共有鍵を署名して、BさんがAさんに暗号化された通信路で送りつける
3. Aさんは、同じ共有鍵を持っているので、Bさん署名済み共有鍵を検証できる
(Bさんが、Aさんが本物か確かめるのも同様の手順で行える。)
楕円曲線ディフィー・ヘルマン鍵共有の公開鍵を署名したほうが、通信するときの効率は良さそう。
なぜなら、公開鍵を転送するとき、一緒に署名も送れば良いから。
その方法にセキュリティ的に問題がないと証明できるなら、そうしたかった。
だが、以下のようにWikipediaで説明からわかるように、楕円曲線に関する数学的知識が必要。
https://gyazo.com/d74fdff771955c0f3b5a37ea27c0e30a
楕円曲線に関する数学的知識がなく、署名して問題がないか判断できなかった。 例えば、「楕円曲線ディフィーヘルマンの公開鍵」と「その公開鍵のBさんの署名」をBさんと通信して事前に手に入れて、それをBさんになりすますために使える可能性がないことを証明することができなかった。
セキュリティ関連は特に理論を把握していない状態でオレオレ実装をするとセキュリティホールができると思っている。
そのため、楕円曲線の数学的な知識を必要としない状態で、なりすましを防止する方法を考えていた。
上記の案は「楕円曲線ディフィー・ヘルマン鍵共有」と分けて考えることができるはず。
つまり、暗号化された通信路を得る手段として「楕円曲線ディフィー・ヘルマン鍵共有」を使っているだけである。
そして、通信毎に変わる互いに知っている共有鍵を署名することで、検証もできる。
共有鍵の署名は、暗号化された通信路で送られるため、暗号に問題ないなら、盗聴の問題はない。
共通鍵は毎度変わるため、署名を入手後にそれをリプレイして使ってなりすますこともできないはず。
SSHの公開鍵認証とやりたいことは似ている(同じだと思う)。
SSHと同じ方法なら、とても信頼できると思う。これで実装したい。